package com.styletransfer.controller;

import com.styletransfer.model.*;
import com.styletransfer.service.WorkService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 作品控制器
 *
 * 提供作品相关的API接口，包括创建、更新、删除、查询作品等
 */
@RestController
@RequestMapping("/work")
public class WorkController {

    @Autowired
    private WorkService workService;

    /**
     * 创建作品
     *
     * @param work 作品信息
     * @param originalImage 原始图片
     * @param resultImage 结果图片
     * @return API响应
     */
    @PostMapping("/create")
    public ApiResponse<Work> createWork(
            @RequestPart("work") Work work,
            @RequestPart("originalImage") MultipartFile originalImage,
            @RequestPart("resultImage") MultipartFile resultImage) {
        return workService.createWork(work, originalImage, resultImage);
    }

    /**
     * 更新作品
     *
     * @param work 作品信息
     * @return API响应
     */
    @PutMapping("/update")
    public ApiResponse<Work> updateWork(@RequestBody Work work) {
        return workService.updateWork(work);
    }

    /**
     * 删除作品
     *
     * @param id 作品ID
     * @return API响应
     */
    @DeleteMapping("/{id}")
    public ApiResponse<Void> deleteWork(@PathVariable Long id) {
        return workService.deleteWork(id);
    }

    /**
     * 根据ID获取作品
     *
     * @param id 作品ID
     * @return API响应
     */
    @GetMapping("/{id}")
    public ApiResponse<Work> getWorkById(@PathVariable Long id) {

        return workService.findById(id);
    }

    /**
     * 获取用户的作品
     *
     * @param userId 用户ID
     * @param page 页码
     * @param size 每页大小
     * @param filter 筛选条件
     * @return API响应
     */
    @GetMapping("/user/{userId}")
    public ApiResponse<PageResponse<Work>> getUserWorks(
            @PathVariable Long userId,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer size,
            @RequestParam(required = false) String filter) {
        PageRequest pageRequest = new PageRequest(page, size);
        return workService.findByUserPage(userId, pageRequest, filter);
    }

    /**
     * 获取公开的作品
     *
     * @return API响应
     */
    @GetMapping("/public")
    public ApiResponse<List<Work>> getPublicWorks() {
        return workService.findPublic();
    }

    /**
     * 获取热门作品
     *
     * @param limit 限制数量
     * @return API响应
     */
    @GetMapping("/hot")
    public ApiResponse<List<Work>> getHotWorks(@RequestParam(defaultValue = "10") Integer limit) {
        return workService.findHot(limit);
    }

    /**
     * 获取最新作品
     *
     * @param limit 限制数量
     * @return API响应
     */
    @GetMapping("/latest")
    public ApiResponse<List<Work>> getLatestWorks(@RequestParam(defaultValue = "10") Integer limit) {
        return workService.findLatest(limit);
    }

    /**
     * 根据风格获取作品
     *
     * @param styleId 风格ID
     * @return API响应
     */
    @GetMapping("/style/{styleId}")
    public ApiResponse<List<Work>> getWorksByStyle(@PathVariable Long styleId) {
        return workService.findByStyle(styleId);
    }

    /**
     * 根据风格ID分页查询作品
     *
     * @param styleId 风格ID（逗号分隔的字符串）
     * @param page 页码
     * @param size 每页大小
     * @return 分页响应
     */
    @GetMapping("/style/{styleId}/page")
    public ApiResponse<PageResponse<Work>> getWorksByStylePage(
            @PathVariable String styleId,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer size) {
        PageRequest pageRequest = new PageRequest(page, size);
        PageResponse<Work> workPageResponse = workService.findByStylePage(styleId, pageRequest);
        return ApiResponse.success(workPageResponse);
    }

    /**
     * 分页查询作品
     *
     * @param page 页码
     * @param size 每页大小
     * @param keyword 关键词搜索
     * @return 分页响应
     */
    @GetMapping("/page")
    public ApiResponse<PageResponse<Work>> getWorksByPage(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer size,
            @RequestParam(required = false) String keyword) {
        PageRequest pageRequest = new PageRequest(page, size);
        PageResponse<Work> workPageResponse = workService.findByPage(pageRequest, keyword);
        return ApiResponse.success(workPageResponse);
    }

    /**
     * 获取相似作品
     *
     * @param id 作品ID
     * @return API响应
     */
    @GetMapping("/similar")
    public ApiResponse<List<Work>> getSimilarWorks(@RequestParam Long id) {
        return workService.findSimilarWorks(id);
    }

    /**
     * 生成分享海报
     *
     * @param data 分享参数
     * @return API响应
     */
    @PostMapping("/share")
    public ApiResponse<String> generateSharePoster(@RequestBody SharePosterRequest data) {
        return workService.generateSharePoster(data);
    }

    /**
     * 下载作品结果图片并上传到OSS
     *
     * 此接口会下载指定作品的结果图片，然后将其上传到阿里云OSS，
     * 并更新数据库中的图片URL地址
     *
     * @return API响应，包含新的图片URL
     */
    @PostMapping("/upload-result-to-oss")
    public ApiResponse<String> uploadResultImageToOss() {
        return workService.downloadAndUploadResultImage();
    }
}
